package com.mmall.concurrency.example.threadPool;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Executes 四个常用线程池类型都是对 ThreadPoolExecutor 构造函数的封装
 * corePoolSize 核心线程数 实际运行线程数
 * maximumPoolSize 最大线程数 最多可以创建多少个线程
 * keepAliveTime 非核心线程数闲置线程最长存活时间
 *
 * 自定义线程池
 * new LinkedBlockingQueue() 容量是 Integer.MAX_VALUE 最大值
 * 值为 2 的 31 次方 - 1 的常量，它表示 int 类型能够表示的最大值：214748364
 */
@Slf4j
public class ThreadPoolExample1 {

    public static void main(String[] args) {
        // 此线程池表达的含义是：核心线程数1，最多线程数1
//        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
//                new LinkedBlockingQueue<Runnable>());

        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 2, 0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>(3));
        // 任务1 线程池创建线程并执行
        threadPoolExecutor.execute(new TaskThread("任务1"));
        // 任务2 存放在 LinkedBlockingQueue
        threadPoolExecutor.execute(new TaskThread("任务2"));
        // 任务3 存放在 LinkedBlockingQueue
        threadPoolExecutor.execute(new TaskThread("任务3"));
        // 任务4 存放在 LinkedBlockingQueue
        threadPoolExecutor.execute(new TaskThread("任务4"));

        /**
         * 任务2、3、4 都是存放在缓存队列中
         * 任务5 判断实际创建线程数是否 >= 2，没有大于则创建一个独立的线程执行任务5，这个独立线程会被复用
         * 任务6 会被拒绝
         */

        // 任务5
        threadPoolExecutor.execute(new TaskThread("任务5"));
        // 任务6
        threadPoolExecutor.execute(new TaskThread("任务5"));

    }
}

/**
 * 线程执行任务
 */
class TaskThread implements Runnable {
    private String taskName;
    public TaskThread(String taskName) {
        this.taskName = taskName;
    }

    public void run() {
        System.out.println(Thread.currentThread().getName()+taskName);
    }
}
